package com.cyou.dream.rule;

import com.cyou.dream.application.ApplicationCommon;
import com.cyou.dream.context.RuleContext;
import com.cyou.dream.core.IRule;
import com.cyou.dream.define.ERule;
import com.cyou.dream.define.ERuleParam;
import org.springframework.data.redis.core.RedisTemplate;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;

/**
 * NaturalDayCounterRule 类实现了自然日计数器规则。
 * <p>
 * 该规则用于在每个自然日对某个键的访问次数进行计数，并根据设定的阈值判断是否通过。
 * <p>
 * 规则脚本通过 Redis 执行，具体的 Lua 脚本配置在 {@link ERule#NATURE_DAY_COUNTER} 。
 * <p>
 * 该规则的参数如下：
 * <ul> {@code ERuleParam.THRESHOLD} - 访问次数阈值。 </ul>
 * <p>
 * 示例场景：玩家每个自然日内最多可以领取 5 次奖励。
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class NaturalDayCounterRule implements IRule {

    @Override
    public boolean evaluate(RuleContext context) {

        Object[] args = {
                context.getRuleParams().get(ERuleParam.THRESHOLD.getKey()),
        };

        String currentDate = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);

        List<String> key = Collections.singletonList(context.getActualKey() + "_" + currentDate);

        RedisTemplate redisTemplate = ApplicationCommon.context().getBean("redisTemplate", RedisTemplate.class);

        Long result = (Long) redisTemplate.execute(
                ERule.NATURE_DAY_COUNTER.getRuleScript(),
                key,
                args
        );

        return result == 1;
    }

}
